{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Chapter 5: Sentiment analysis with the perceptron algorithm\n",
    "\n",
    "### Importing the necessary packages"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Importing packages\n",
    "from matplotlib import pyplot as plt\n",
    "import numpy as np\n",
    "import random\n",
    "import utils"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Defining and plotting our dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "features = np.array([[1,0],[0,2],[1,1],[1,2],[1,3],[2,2],[2,3],[3,2]])\n",
    "labels = np.array([0,0,0,0,1,1,1,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plotting the points\n",
    "utils.plot_points(features, labels)\n",
    "\n",
    "# Uncomment the following line to see a good line fit for this data.\n",
    "#utils.draw_line(1,1,-3.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Coding the perceptron trick"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def score(weights, bias, features):\n",
    "    return features.dot(weights) + bias\n",
    "\n",
    "def step(x):\n",
    "    if x >= 0:\n",
    "        return 1\n",
    "    else:\n",
    "        return 0\n",
    "\n",
    "def prediction(weights, bias, features):\n",
    "    return step(score(weights, bias, features))\n",
    "\n",
    "def error(weights, bias, features, label):\n",
    "    pred = prediction(weights, bias, features)\n",
    "    if pred == label:\n",
    "        return 0\n",
    "    else:\n",
    "        return np.abs(score(weights, bias, features))\n",
    "\n",
    "def mean_perceptron_error(weights, bias, features, labels):\n",
    "    total_error = 0\n",
    "    for i in range(len(features)):\n",
    "        total_error += error(weights, bias, features[i], labels[i])\n",
    "    return total_error/len(features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 0\n",
      "1 0\n",
      "0 0\n",
      "1 1\n",
      "1 0\n",
      "1 0\n",
      "1 0\n",
      "1 0\n"
     ]
    }
   ],
   "source": [
    "#weights = [1,1]\n",
    "#bias = -3.5\n",
    "weights = [1,2]\n",
    "bias = -4\n",
    "for i in range(len(features)):\n",
    "    print(prediction(weights, bias, features[i]), error(weights, bias, features[i], labels[i]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# First perceptron trick\n",
    "def perceptron_trick(weights, bias, features, label, learning_rate = 0.01):\n",
    "    pred = prediction(weights, bias, features)\n",
    "    if pred == label:\n",
    "        return weights, bias\n",
    "    else:\n",
    "        if label==1 and pred==0:\n",
    "            for i in range(len(weights)):\n",
    "                weights[i] += features[i]*learning_rate\n",
    "            bias += learning_rate\n",
    "        elif label==0 and pred==1:\n",
    "            for i in range(len(weights)):\n",
    "                weights[i] -= features[i]*learning_rate\n",
    "            bias -= learning_rate\n",
    "    return weights, bias"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Shorter version of the perceptron trick\n",
    "def perceptron_trick(weights, bias, features, label, learning_rate = 0.01):\n",
    "    pred = prediction(weights, bias, features)\n",
    "    for i in range(len(weights)):\n",
    "        weights[i] += (label-pred)*features[i]*learning_rate\n",
    "        bias += (label-pred)*learning_rate\n",
    "    return weights, bias"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([0.98, 1.97], -4.02)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "perceptron_trick(weights, bias, features[6], 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Running the perceptron algorithm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "random.seed(0)\n",
    "def perceptron_algorithm(features, labels, learning_rate = 0.01, epochs = 200):\n",
    "    weights = [1.0 for i in range(len(features[0]))]\n",
    "    bias = 0.0\n",
    "    errors = []\n",
    "    for epoch in range(epochs):\n",
    "        # Coment the following line to draw only the final classifier\n",
    "        utils.draw_line(weights[0], weights[1], bias, color='grey', linewidth=1.0, linestyle='dotted')\n",
    "        error = mean_perceptron_error(weights, bias, features, labels)\n",
    "        errors.append(error)\n",
    "        i = random.randint(0, len(features)-1)\n",
    "        weights, bias = perceptron_trick(weights, bias, features[i], labels[i])\n",
    "    utils.draw_line(weights[0], weights[1], bias)\n",
    "    utils.plot_points(features, labels)\n",
    "    plt.show()\n",
    "    plt.scatter(range(epochs), errors)\n",
    "    return weights, bias"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/luisserrano/anaconda3/lib/python3.7/site-packages/IPython/core/pylabtools.py:132: UserWarning: Creating legend with loc=\"best\" can be slow with large amounts of data.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "([0.6299999999999997, 0.17999999999999938], -1.0400000000000007)"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "perceptron_algorithm(features, labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The perceptron algorithm using Turi Create"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "import turicreate as tc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\"><table frame=\"box\" rules=\"cols\">\n",
       "    <tr>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">aack</th>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">beep</th>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">prediction</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">0</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">0</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">2</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">2</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">3</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">2</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">2</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">2</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">3</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">3</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">2</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1</td>\n",
       "    </tr>\n",
       "</table>\n",
       "[8 rows x 3 columns]<br/>\n",
       "</div>"
      ],
      "text/plain": [
       "Columns:\n",
       "\taack\tint\n",
       "\tbeep\tint\n",
       "\tprediction\tint\n",
       "\n",
       "Rows: 8\n",
       "\n",
       "Data:\n",
       "+------+------+------------+\n",
       "| aack | beep | prediction |\n",
       "+------+------+------------+\n",
       "|  1   |  0   |     0      |\n",
       "|  0   |  2   |     0      |\n",
       "|  1   |  1   |     0      |\n",
       "|  1   |  2   |     0      |\n",
       "|  1   |  3   |     1      |\n",
       "|  2   |  2   |     1      |\n",
       "|  2   |  3   |     1      |\n",
       "|  3   |  2   |     1      |\n",
       "+------+------+------------+\n",
       "[8 rows x 3 columns]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "datadict = {'aack': features[:,0], 'beep':features[:,1], 'prediction': labels}\n",
    "data = tc.SFrame(datadict)\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre>Logistic regression:</pre>"
      ],
      "text/plain": [
       "Logistic regression:"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>--------------------------------------------------------</pre>"
      ],
      "text/plain": [
       "--------------------------------------------------------"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>Number of examples          : 8</pre>"
      ],
      "text/plain": [
       "Number of examples          : 8"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>Number of classes           : 2</pre>"
      ],
      "text/plain": [
       "Number of classes           : 2"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>Number of feature columns   : 2</pre>"
      ],
      "text/plain": [
       "Number of feature columns   : 2"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>Number of unpacked features : 2</pre>"
      ],
      "text/plain": [
       "Number of unpacked features : 2"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>Number of coefficients      : 3</pre>"
      ],
      "text/plain": [
       "Number of coefficients      : 3"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>Starting Newton Method</pre>"
      ],
      "text/plain": [
       "Starting Newton Method"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>--------------------------------------------------------</pre>"
      ],
      "text/plain": [
       "--------------------------------------------------------"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>+-----------+----------+--------------+-------------------+</pre>"
      ],
      "text/plain": [
       "+-----------+----------+--------------+-------------------+"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>| Iteration | Passes   | Elapsed Time | Training Accuracy |</pre>"
      ],
      "text/plain": [
       "| Iteration | Passes   | Elapsed Time | Training Accuracy |"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>+-----------+----------+--------------+-------------------+</pre>"
      ],
      "text/plain": [
       "+-----------+----------+--------------+-------------------+"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>| 1         | 2        | 1.012136     | 1.000000          |</pre>"
      ],
      "text/plain": [
       "| 1         | 2        | 1.012136     | 1.000000          |"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>| 2         | 3        | 1.013801     | 1.000000          |</pre>"
      ],
      "text/plain": [
       "| 2         | 3        | 1.013801     | 1.000000          |"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>| 3         | 4        | 1.014578     | 1.000000          |</pre>"
      ],
      "text/plain": [
       "| 3         | 4        | 1.014578     | 1.000000          |"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>| 4         | 5        | 1.015180     | 1.000000          |</pre>"
      ],
      "text/plain": [
       "| 4         | 5        | 1.015180     | 1.000000          |"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>+-----------+----------+--------------+-------------------+</pre>"
      ],
      "text/plain": [
       "+-----------+----------+--------------+-------------------+"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>SUCCESS: Optimal solution found.</pre>"
      ],
      "text/plain": [
       "SUCCESS: Optimal solution found."
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre></pre>"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "perceptron = tc.logistic_classifier.create(data, target='prediction')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\"><table frame=\"box\" rules=\"cols\">\n",
       "    <tr>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">name</th>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">index</th>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">class</th>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">value</th>\n",
       "        <th style=\"padding-left: 1em; padding-right: 1em; text-align: center\">stderr</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">(intercept)</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">None</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">-8.959708265685023</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">6.844844514902394</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">aack</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">None</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">2.972553703911967</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">2.6977310191336055</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">beep</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">None</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">1</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">2.498635186535742</td>\n",
       "        <td style=\"padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top\">2.455296103059154</td>\n",
       "    </tr>\n",
       "</table>\n",
       "[3 rows x 5 columns]<br/>\n",
       "</div>"
      ],
      "text/plain": [
       "Columns:\n",
       "\tname\tstr\n",
       "\tindex\tstr\n",
       "\tclass\tint\n",
       "\tvalue\tfloat\n",
       "\tstderr\tfloat\n",
       "\n",
       "Rows: 3\n",
       "\n",
       "Data:\n",
       "+-------------+-------+-------+--------------------+--------------------+\n",
       "|     name    | index | class |       value        |       stderr       |\n",
       "+-------------+-------+-------+--------------------+--------------------+\n",
       "| (intercept) |  None |   1   | -8.959708265685023 | 6.844844514902394  |\n",
       "|     aack    |  None |   1   | 2.972553703911967  | 2.6977310191336055 |\n",
       "|     beep    |  None |   1   | 2.498635186535742  | 2.455296103059154  |\n",
       "+-------------+-------+-------+--------------------+--------------------+\n",
       "[3 rows x 5 columns]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "perceptron.coefficients"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
